﻿/* $BEGIN_EBRAINENGINE_LICENSE$
* This file is part of eBrain-Engine, a platform to administer neuropsychological tests.
*
* [ Copyright (C) 2012: Istituto Auxologico Italiano ]
* [ eBrain Team: Giuseppe Riva, Barbara Poletti, Pietro Cipresso, Laura Carelli, Federica Solca, Elisa Pedrioli, Paolo Meriggi]
*
* eBrain-Engine is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
 * eBrain-Engine is distributed in the hope that it will be useful, but
*                         WITHOUT ANY WARRANTY
* - without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
*
 * You should have received a copy of the GNU General Public License along with
* this program.  If not, see <http://www.gnu.org/licenses/>.
*
* $END_EBRAINENGINE_LICENSE$
 
* Authors: Paolo Meriggi (pmeriggi@dongnocchi.it)
* Description: [descrizione del file]
*/


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace eBrain
{
    public partial class ExperimentMainForm : Form
    {
        [DllImportAttribute("User32.dll")]
        public static extern IntPtr FindWindow(String ClassName, String WindowName);

        [DllImportAttribute("User32.dll")]
        public static extern IntPtr SetParent(IntPtr ChildWinHdl, IntPtr ParentWinHdl);

        IntPtr hWnd_P3Speller;

        public static Mutex GraphMutex;
        public static Mutex CanvasMutex, CanvasUserCopyMutex;

        public AreaToHighlight SelectedArea, InROIArea;

        public bool bMultiMonitor = false;

        public bool calibrating = false;

        private Bitmap Canvas;
        public Bitmap CanvasUserCopy;
        public System.Timers.Timer PersistenceTimer;

        public bool SmoothPursuitMode = false;

        public bool HighlightEnabled = false;

        public Image ImageTarget, ImageMask;
        public int TargetSize;
        public int TargetPosX = 0, TargetPosY = 0;

        public int offset = 0;

        public Int32 myHandle;

        //        public Form TranspLayerForm;

        public Panel TransparentPanel;
        int curr_ID, min_ID, max_ID;
        Color sel_color;
        int sel_size;
        bool choice_performed = false;
        //        public bool bTransparentPanelON = false;
        public bool P300SpellerMode = false;

        public RoiList myRL;

        public void SetSmoothPursuitMode(bool flag)
        {
            SmoothPursuitMode = flag;
        }

        public void SetP300SpellerMode(bool flag)
        {
            P300SpellerMode = flag;
        }

        public ExperimentMainForm()
        {
            InitializeComponent();
            this.FormBorderStyle = FormBorderStyle.None;

            CheckAndMoveToSecondaryScreen();

            SelectedArea = new AreaToHighlight();
            InROIArea = new AreaToHighlight();
            PersistenceTimer = new System.Timers.Timer();

            CanvasMutex = new Mutex();
            CanvasUserCopyMutex = new Mutex();
            GraphMutex = new Mutex();

            int a = this.Width;
            a = this.Height;

            PrepareTransparentLayer();

            myHandle = this.Handle.ToInt32();
        }

        //[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
        //protected override void WndProc(ref Message m)
        //{
        //    if (m.Msg == (int)WindowsMessages.WM_PARENTNOTIFY)
        //    {
        //        Debug.WriteLine(m);
        //        MessageBox.Show("Chiuso");

        //    }

        //    base.WndProc(ref m);
        //}

        private void PrepareTransparentLayer()
        {
            Screen[] sc;
            sc = Screen.AllScreens;

            TransparentPanel = new Panel();
            TransparentPanel.BackColor = Color.FromArgb(0, 0, 0, 0);
            //this.Controls.Add(TransparentPanel);
            TransparentPanel.Parent = this;
            TransparentPanel.Width = sc[1].WorkingArea.Width;
            TransparentPanel.Height = sc[1].WorkingArea.Height;
            TransparentPanel.Top = 0;
            TransparentPanel.Left = 0;

            TransparentPanel.Visible = false;
            TransparentPanel.SendToBack();
        }

        public void EraseTransparentPanel()
        {
            Graphics e = TransparentPanel.CreateGraphics();// Graphics.FromHwnd(hWnd_P3Speller);
            e.Clear(TransparentPanel.BackColor);
            e.Dispose();
        }




        //public void ManageHighlightSelection(RoiList RL, int ROI_selected, int ROI_ID_min, int ROI_ID_MAX, Color s_color, int size)
        //{
        //    //int ret_int = 0;
        //    int x0, y0, h, w;

        //    myRL = RL;
        //    sel_color = s_color;
        //    sel_size = size;

        //    choice_performed = false;
        //    curr_ID = ROI_selected;
        //    min_ID = ROI_ID_min;
        //    max_ID = ROI_ID_MAX;

        //    //porto il layer davanti
        //    TransparentPanel.Visible = true;
        //    TransparentPanel.Show();
        //    TransparentPanel.BringToFront();
            

        //    //attivo la possibilità di scegliere altri target (OnKeyPress)
        //    this.KeyDown += new KeyEventHandler(ExperimentMainForm_KeyDown);

        //    //Assegno i valori alle variabili
        //    x0 = myRL.myRoiList[ROI_selected].x0;
        //    y0 = myRL.myRoiList[ROI_selected].y0;
        //    w = myRL.myRoiList[ROI_selected].width;
        //    h = myRL.myRoiList[ROI_selected].height;

        //    Graphics e = TransparentPanel.CreateGraphics();// Graphics.FromHwnd(hWnd_P3Speller);

        //    e.Clear(this.BackColor);

        //    e.DrawRectangle(new Pen(s_color, size), x0, y0, w, h);

        //    e.Dispose();

        //    this.Refresh();
        //    //TransparentPanel.Refresh();
        //}

        public void UpdateSelHighlight()
        {

            //Assegno i valori alle variabili
            int x0 = myRL.myRoiList[curr_ID].x0;
            int y0 = myRL.myRoiList[curr_ID].y0;
            int w = myRL.myRoiList[curr_ID].width;
            int h = myRL.myRoiList[curr_ID].height;

            Graphics e = TransparentPanel.CreateGraphics();// Graphics.FromHwnd(hWnd_P3Speller);

            e.Clear(this.BackColor);

            e.DrawRectangle(new Pen(sel_color, sel_size), x0, y0, w, h);

            e.Dispose();

            this.Refresh();

        }

        //metodo per completare l'esperimento
        public void EndOfExperiment()
        {
            hWnd_P3Speller = FindWindow(null, "BCI2000 P3 Speller");
            IntPtr ret;
            //rimetto a posto la parentela della finestra dello speller
            if ((int)hWnd_P3Speller > 0)
                ret = SetParent(hWnd_P3Speller, (IntPtr)null);

            Thread.Sleep(100);
            //chiudo il form
            this.Close();
        }

        public void LockCanvas()
        {
            CanvasMutex.WaitOne();
        }

        public void UnlockCanvas()
        {
            CanvasMutex.ReleaseMutex();
        }

        public void LockCanvasUserCopy()
        {
            CanvasUserCopyMutex.WaitOne();
        }

        public void UnlockCanvasUserCopy()
        {
            CanvasUserCopyMutex.ReleaseMutex();
        }

        public void CopyCanvas()
        {
            CanvasMutex.WaitOne();
            CanvasUserCopyMutex.WaitOne();
            Graphics g = Graphics.FromImage(Canvas);
            g.DrawImageUnscaled(CanvasUserCopy, 0, 0);
            g.Dispose();
            CanvasUserCopyMutex.ReleaseMutex();
            CanvasMutex.ReleaseMutex();
        }

        public void CopyImage(Image img)
        {
            CanvasMutex.WaitOne();
            Graphics g = Graphics.FromImage(Canvas);
            g.DrawImageUnscaled(img, 0, 0);
            g.Dispose();
            CanvasMutex.ReleaseMutex();
        }

        public void CopyBackCanvas()
        {
            CanvasUserCopyMutex.WaitOne();
            Graphics g = Graphics.FromImage(CanvasUserCopy);

            CanvasMutex.WaitOne();
            g.DrawImageUnscaled(Canvas, 0, 0);
            CanvasMutex.ReleaseMutex();

            g.Dispose();
            CanvasUserCopyMutex.ReleaseMutex();

        }

        /// <summary>
        /// Tratto da http://www.dotnetwatch.com/C-How-to-Show-windows-form-o444_AR.aspx
        /// </summary>
        public void CheckAndMoveToSecondaryScreen()
        {
            Screen[] sc;
            sc = Screen.AllScreens;

            if (sc.Length > 1)
            {
                this.Left = sc[1].WorkingArea.Width;
                this.Top = sc[1].WorkingArea.Height;
                this.StartPosition = FormStartPosition.Manual;
                this.Location = sc[1].Bounds.Location;

                offset = sc[1].WorkingArea.Location.X;

                //myLog.Log("Moving to the secondary screen" + "Left(& width)=" + this.Left + "; Top (& Height)=" + this.Top);
                Point p = new Point(sc[1].WorkingArea.Location.X, sc[0].WorkingArea.Location.Y);
                this.Location = p;

                bMultiMonitor = true;

                Canvas = new Bitmap(sc[1].WorkingArea.Width, sc[1].WorkingArea.Height);
                CanvasUserCopy = new Bitmap(sc[1].WorkingArea.Width, sc[1].WorkingArea.Height);
            }
            else
            {
                Canvas = new Bitmap(sc[0].WorkingArea.Width, sc[0].WorkingArea.Height);
                CanvasUserCopy = new Bitmap(sc[0].WorkingArea.Width, sc[0].WorkingArea.Height);
                offset = 0;
                bMultiMonitor = false;
            }

            this.WindowState = FormWindowState.Maximized;

            this.Show();
        }

        public void TurnOffInROIArea()
        {
            //lock (SyncLock)
            InROIArea.toHighlight = false;
            //this.Invalidate();
        }

        public void TurnOffSelectedArea()
        {
            //lock (SyncLock)
            SelectedArea.toHighlight = false;
            //this.Invalidate();
        }

        public void UpdateInROIArea(int _x, int _y, int _w, int _h, Color _c, int _size, int Persistence_ms)
        {
            //lock (SyncLock)
            //{
            InROIArea.x = _x;
            InROIArea.y = _y;
            InROIArea.w = _w;
            InROIArea.h = _h;
            InROIArea.pen_color = _c;
            InROIArea.pen_size = _size;

            if (Persistence_ms > 0)
            {

            }

            InROIArea.toHighlight = true;
            //}
            //this.Invalidate();
        }

        public void UpdateSelectedArea(int _x, int _y, int _w, int _h, Color _c, int _size)//, int Persistence_ms)
        {
            //lock (SyncLock)
            //{
            SelectedArea.x = _x;
            SelectedArea.y = _y;
            SelectedArea.w = _w;
            SelectedArea.h = _h;
            SelectedArea.pen_color = _c;
            SelectedArea.pen_size = _size;

            //if (Persistence_ms > 0)
            //{
            //    StartPersistenceTimer(Persistence_ms);
            //}

            SelectedArea.toHighlight = true;
            //}
            //this.Invalidate();
        }


        public void HightlightBorder()
        {
            CanvasMutex.WaitOne();

            Graphics g = Graphics.FromImage(Canvas);
            g.DrawRectangle(new Pen(Color.White, 30), 15, 15, this.Width - 30, this.Height - 30);
            //e.DrawRectangle(new Pen(Color.Green, 10), 0, 0, 100, 100);

            g.Dispose();
            this.Invalidate();

            CanvasMutex.ReleaseMutex();
        }

        public void ClearHighlightBorder()
        {
            CanvasMutex.WaitOne();

            Graphics g = Graphics.FromImage(Canvas);
            g.DrawRectangle(new Pen(BackColor, 30), 15, 15, this.Width - 30, this.Height - 30);

            g.Dispose();

            CanvasMutex.ReleaseMutex();
        }

        public void SetFrontWindow()
        {
            this.TopMost = true;
            //this.Show();
            //this.Show();
            this.BringToFront();
            this.WindowState = FormWindowState.Maximized;
            this.Activate();
            this.Focus();

            this.Refresh();
            //this.InvokeGotFocus(this, EventArgs.Empty);
        }

        public void SetInBackground()
        {
            this.TopMost = false;
            this.WindowState = FormWindowState.Normal;
            this.SendToBack();
        }

        //public void EraseTransparentLayer()
        //{
        //    if (TranspLayerForm != null)
        //    {
        //        TranspLayerForm.Invoke(new EventHandler(delegate {
        //            TranspLayerForm.Erase(); 
        //            TranspLayerForm.SendToBack();

        //        }));
        //    }
        //}
        //public void StartPersistenceTimer(int ms_delay)
        //{
        //    PersistenceTimer.Elapsed += new System.Timers.ElapsedEventHandler(PersistenceTimerElapsedEvent);
        //    PersistenceTimer.Interval = ms_delay;
        //    SelectedArea.PersistenceTimerStarted = true;
        //    PersistenceTimer.Start();
        //}

        //private void PersistenceTimerElapsedEvent(object sender, EventArgs e)
        //{
        //    PersistenceTimer.Stop();
        //    PersistenceTimer.Elapsed -= PersistenceTimerElapsedEvent;
        //    //lock (SyncLock)
        //    //{
        //    SelectedArea.PersistenceTimerStarted = false;
        //    SelectedArea.toHighlight = false;
        //    //}
        //}

        public void PrepareMaskAndTarget(int size, Color bkg, Color frg)
        {

            TargetSize = size;

            //preparo la maschera ed il target
            ImageMask = new Bitmap(size, size);
            Graphics g = Graphics.FromImage(ImageMask);
            g.Clear(bkg);
            g.Dispose();

            ImageTarget = new Bitmap(size, size);
            g = Graphics.FromImage(ImageTarget);
            g.Clear(bkg);

            g.FillEllipse(new System.Drawing.SolidBrush(frg), 0, 0, size, size);

            //g.DrawEllipse(new Pen(bkg), 

            g.Dispose();
        }


        public void UpdateTargetCoord(int x, int y, int xmax, int xmin, int ymax, int ymin, Color bkg)
        {

            int w = xmax - xmin;
            int h = ymax - ymin;
            Bitmap bp = new Bitmap(w, h);
            Graphics g2 = Graphics.FromImage(bp);
            g2.Clear(bkg);

            GraphMutex.WaitOne();
            g2.DrawImageUnscaled(ImageTarget, x - xmin, y - ymin);
            GraphMutex.ReleaseMutex();

            g2.Dispose();

            //lock (myCanvas)
            //{
            //myExpW.Graph

            LockCanvas();
            Graphics g = Graphics.FromImage(Canvas);
            //this.SuspendLayout();
            //g.DrawImageUnscaled(Mask, last_x, last_y);
            //g.DrawImageUnscaled(Target, x, y);
            g.DrawImageUnscaled(bp, xmin, ymin);
            //this.ResumeLayout(false);
            g.Dispose();

            UnlockCanvas();
            Rectangle rc = new Rectangle(xmin, ymin, w, h);

            this.Invalidate(rc);
        }

        public void ClearScreen(Color bkgrnd)
        {
            CanvasMutex.WaitOne();
            Graphics g = Graphics.FromImage(Canvas);
            g.Clear(bkgrnd);
            g.Dispose();
            CanvasMutex.ReleaseMutex();

            TurnOffInROIArea();
            TurnOffSelectedArea();

            //TODO: verificare che sia da inserire qui l'aggiornamento dello schermo.
            //this.Invalidate();
        }

        public void ClearScreen()
        {
            CanvasMutex.WaitOne();
            Graphics g = Graphics.FromImage(Canvas);
            g.Clear(BackColor);
            g.Dispose();
            CanvasMutex.ReleaseMutex();

            TurnOffInROIArea();
            TurnOffSelectedArea();

            //TODO: verificare che sia da inserire qui l'aggiornamento dello schermo.
            //this.Invalidate();
        }

        public void HijackP3SpellerGraphics()
        {
            IntPtr myWinHandle = this.Handle;
            hWnd_P3Speller = FindWindow(null, "BCI2000 P3 Speller");
            IntPtr ret;
            if ((int)hWnd_P3Speller > 0)
                ret = SetParent(hWnd_P3Speller, myWinHandle);

        }


        protected override void OnPaint(PaintEventArgs e)
        {
            //Console.WriteLine("OnPaint");

            if (!calibrating)
            {
                if (!SmoothPursuitMode )
                {
                    CanvasMutex.WaitOne();
                    e.Graphics.DrawImageUnscaled(Canvas, 0, 0);
                    CanvasMutex.ReleaseMutex();

                    if (HighlightEnabled)
                    {

                        if (InROIArea.toHighlight)
                            e.Graphics.DrawRectangle(new Pen(InROIArea.pen_color, InROIArea.pen_size),
                                InROIArea.x, InROIArea.y, InROIArea.w, InROIArea.h);

                        if (SelectedArea.toHighlight)
                            e.Graphics.DrawRectangle(new Pen(SelectedArea.pen_color, SelectedArea.pen_size),
                                SelectedArea.x, SelectedArea.y, SelectedArea.w, SelectedArea.h);
                    }
                }

                base.OnPaint(e);
            }
        }

    //    private void ExperimentMainForm_KeyDown(object sender, KeyEventArgs e)
    //    {
    //        switch (e.KeyCode)
    //        {
    //            case Keys.Left:
    //                if (--curr_ID < min_ID)
    //                    curr_ID = max_ID;
    //                break;

    //            case Keys.Right:
    //                if (++curr_ID > max_ID)
    //                    curr_ID = min_ID;

    //                break;

    //            case Keys.Enter:

    //                choice_performed = true;
    //                this.KeyDown -= ExperimentMainForm_KeyDown;
    //                break;
    //        }

    //        UpdateSelHighlight();
    //        // this.Update();
    //        this.Invalidate();

    //        //bRedrawSelection = true;
    //        //this.Refresh();
    //    }
    
    }


    public class AreaToHighlight
    {
        public bool toHighlight = false;
        public int x, y, w, h;
        public int pen_size;
        public Color pen_color;
        public bool PersistenceTimerStarted = false;

    }


    public class PosSequenceElem
    {
        public string TrialID;
        public string tag;
        public int x;
        public int y;
        public int t_ms; //time in ms

        public PosSequenceElem(string _id, string _tag, int _x, int _y, int _t)
        {
            TrialID = _id;
            tag = _tag;
            x = _x;
            y = _y;
            t_ms = _t;
        }


    }

    //public enum WindowsMessages
    //{
    //    WM_ACTIVATE = 0x6,
    //    WM_ACTIVATEAPP = 0x1C,
    //    WM_AFXFIRST = 0x360,
    //    WM_AFXLAST = 0x37F,
    //    WM_APP = 0x8000,
    //    WM_ASKCBFORMATNAME = 0x30C,
    //    WM_CANCELJOURNAL = 0x4B,
    //    WM_CANCELMODE = 0x1F,
    //    WM_CAPTURECHANGED = 0x215,
    //    WM_CHANGECBCHAIN = 0x30D,
    //    WM_CHAR = 0x102,
    //    WM_CHARTOITEM = 0x2F,
    //    WM_CHILDACTIVATE = 0x22,
    //    WM_CLEAR = 0x303,
    //    WM_CLOSE = 0x10,
    //    WM_COMMAND = 0x111,
    //    WM_COMPACTING = 0x41,
    //    WM_COMPAREITEM = 0x39,
    //    WM_CONTEXTMENU = 0x7B,
    //    WM_COPY = 0x301,
    //    WM_COPYDATA = 0x4A,
    //    WM_CREATE = 0x1,
    //    WM_CTLCOLORBTN = 0x135,
    //    WM_CTLCOLORDLG = 0x136,
    //    WM_CTLCOLOREDIT = 0x133,
    //    WM_CTLCOLORLISTBOX = 0x134,
    //    WM_CTLCOLORMSGBOX = 0x132,
    //    WM_CTLCOLORSCROLLBAR = 0x137,
    //    WM_CTLCOLORSTATIC = 0x138,
    //    WM_CUT = 0x300,
    //    WM_DEADCHAR = 0x103,
    //    WM_DELETEITEM = 0x2D,
    //    WM_DESTROY = 0x2,
    //    WM_DESTROYCLIPBOARD = 0x307,
    //    WM_DEVICECHANGE = 0x219,
    //    WM_DEVMODECHANGE = 0x1B,
    //    WM_DISPLAYCHANGE = 0x7E,
    //    WM_DRAWCLIPBOARD = 0x308,
    //    WM_DRAWITEM = 0x2B,
    //    WM_DROPFILES = 0x233,
    //    WM_ENABLE = 0xA,
    //    WM_ENDSESSION = 0x16,
    //    WM_ENTERIDLE = 0x121,
    //    WM_ENTERMENULOOP = 0x211,
    //    WM_ENTERSIZEMOVE = 0x231,
    //    WM_ERASEBKGND = 0x14,
    //    WM_EXITMENULOOP = 0x212,
    //    WM_EXITSIZEMOVE = 0x232,
    //    WM_FONTCHANGE = 0x1D,
    //    WM_GETDLGCODE = 0x87,
    //    WM_GETFONT = 0x31,
    //    WM_GETHOTKEY = 0x33,
    //    WM_GETICON = 0x7F,
    //    WM_GETMINMAXINFO = 0x24,
    //    WM_GETOBJECT = 0x3D,
    //    WM_GETTEXT = 0xD,
    //    WM_GETTEXTLENGTH = 0xE,
    //    WM_HANDHELDFIRST = 0x358,
    //    WM_HANDHELDLAST = 0x35F,
    //    WM_HELP = 0x53,
    //    WM_HOTKEY = 0x312,
    //    WM_HSCROLL = 0x114,
    //    WM_HSCROLLCLIPBOARD = 0x30E,
    //    WM_ICONERASEBKGND = 0x27,
    //    WM_IME_CHAR = 0x286,
    //    WM_IME_COMPOSITION = 0x10F,
    //    WM_IME_COMPOSITIONFULL = 0x284,
    //    WM_IME_CONTROL = 0x283,
    //    WM_IME_ENDCOMPOSITION = 0x10E,
    //    WM_IME_KEYDOWN = 0x290,
    //    WM_IME_KEYLAST = 0x10F,
    //    WM_IME_KEYUP = 0x291,
    //    WM_IME_NOTIFY = 0x282,
    //    WM_IME_REQUEST = 0x288,
    //    WM_IME_SELECT = 0x285,
    //    WM_IME_SETCONTEXT = 0x281,
    //    WM_IME_STARTCOMPOSITION = 0x10D,
    //    WM_INITDIALOG = 0x110,
    //    WM_INITMENU = 0x116,
    //    WM_INITMENUPOPUP = 0x117,
    //    WM_INPUTLANGCHANGE = 0x51,
    //    WM_INPUTLANGCHANGEREQUEST = 0x50,
    //    WM_KEYDOWN = 0x100,
    //    WM_KEYFIRST = 0x100,
    //    WM_KEYLAST = 0x108,
    //    WM_KEYUP = 0x101,
    //    WM_KILLFOCUS = 0x8,
    //    WM_LBUTTONDBLCLK = 0x203,
    //    WM_LBUTTONDOWN = 0x201,
    //    WM_LBUTTONUP = 0x202,
    //    WM_MBUTTONDBLCLK = 0x209,
    //    WM_MBUTTONDOWN = 0x207,
    //    WM_MBUTTONUP = 0x208,
    //    WM_MDIACTIVATE = 0x222,
    //    WM_MDICASCADE = 0x227,
    //    WM_MDICREATE = 0x220,
    //    WM_MDIDESTROY = 0x221,
    //    WM_MDIGETACTIVE = 0x229,
    //    WM_MDIICONARRANGE = 0x228,
    //    WM_MDIMAXIMIZE = 0x225,
    //    WM_MDINEXT = 0x224,
    //    WM_MDIREFRESHMENU = 0x234,
    //    WM_MDIRESTORE = 0x223,
    //    WM_MDISETMENU = 0x230,
    //    WM_MDITILE = 0x226,
    //    WM_MEASUREITEM = 0x2C,
    //    WM_MENUCHAR = 0x120,
    //    WM_MENUCOMMAND = 0x126,
    //    WM_MENUDRAG = 0x123,
    //    WM_MENUGETOBJECT = 0x124,
    //    WM_MENURBUTTONUP = 0x122,
    //    WM_MENUSELECT = 0x11F,
    //    WM_MOUSEACTIVATE = 0x21,
    //    WM_MOUSEFIRST = 0x200,
    //    WM_MOUSEHOVER = 0x2A1,
    //    WM_MOUSELAST = 0x20A,
    //    WM_MOUSELEAVE = 0x2A3,
    //    WM_MOUSEMOVE = 0x200,
    //    WM_MOUSEWHEEL = 0x20A,
    //    WM_MOVE = 0x3,
    //    WM_MOVING = 0x216,
    //    WM_NCACTIVATE = 0x86,
    //    WM_NCCALCSIZE = 0x83,
    //    WM_NCCREATE = 0x81,
    //    WM_NCDESTROY = 0x82,
    //    WM_NCHITTEST = 0x84,
    //    WM_NCLBUTTONDBLCLK = 0xA3,
    //    WM_NCLBUTTONDOWN = 0xA1,
    //    WM_NCLBUTTONUP = 0xA2,
    //    WM_NCMBUTTONDBLCLK = 0xA9,
    //    WM_NCMBUTTONDOWN = 0xA7,
    //    WM_NCMBUTTONUP = 0xA8,
    //    WM_NCMOUSEHOVER = 0x2A0,
    //    WM_NCMOUSELEAVE = 0x2A2,
    //    WM_NCMOUSEMOVE = 0xA0,
    //    WM_NCPAINT = 0x85,
    //    WM_NCRBUTTONDBLCLK = 0xA6,
    //    WM_NCRBUTTONDOWN = 0xA4,
    //    WM_NCRBUTTONUP = 0xA5,
    //    WM_NEXTDLGCTL = 0x28,
    //    WM_NEXTMENU = 0x213,
    //    WM_NOTIFY = 0x4E,
    //    WM_NOTIFYFORMAT = 0x55,
    //    WM_NULL = 0x0,
    //    WM_PAINT = 0xF,
    //    WM_PAINTCLIPBOARD = 0x309,
    //    WM_PAINTICON = 0x26,
    //    WM_PALETTECHANGED = 0x311,
    //    WM_PALETTEISCHANGING = 0x310,
    //    WM_PARENTNOTIFY = 0x210,
    //    WM_PASTE = 0x302,
    //    WM_PENWINFIRST = 0x380,
    //    WM_PENWINLAST = 0x38F,
    //    WM_POWER = 0x48,
    //    WM_PRINT = 0x317,
    //    WM_PRINTCLIENT = 0x318,
    //    WM_QUERYDRAGICON = 0x37,
    //    WM_QUERYENDSESSION = 0x11,
    //    WM_QUERYNEWPALETTE = 0x30F,
    //    WM_QUERYOPEN = 0x13,
    //    WM_QUEUESYNC = 0x23,
    //    WM_QUIT = 0x12,
    //    WM_RBUTTONDBLCLK = 0x206,
    //    WM_RBUTTONDOWN = 0x204,
    //    WM_RBUTTONUP = 0x205,
    //    WM_RENDERALLFORMATS = 0x306,
    //    WM_RENDERFORMAT = 0x305,
    //    WM_SETCURSOR = 0x20,
    //    WM_SETFOCUS = 0x7,
    //    WM_SETFONT = 0x30,
    //    WM_SETHOTKEY = 0x32,
    //    WM_SETICON = 0x80,
    //    WM_SETREDRAW = 0xB,
    //    WM_SETTEXT = 0xC,
    //    WM_SETTINGCHANGE = 0x1A,
    //    WM_SHOWWINDOW = 0x18,
    //    WM_SIZE = 0x5,
    //    WM_SIZECLIPBOARD = 0x30B,
    //    WM_SIZING = 0x214,
    //    WM_SPOOLERSTATUS = 0x2A,
    //    WM_STYLECHANGED = 0x7D,
    //    WM_STYLECHANGING = 0x7C,
    //    WM_SYNCPAINT = 0x88,
    //    WM_SYSCHAR = 0x106,
    //    WM_SYSCOLORCHANGE = 0x15,
    //    WM_SYSCOMMAND = 0x112,
    //    WM_SYSDEADCHAR = 0x107,
    //    WM_SYSKEYDOWN = 0x104,
    //    WM_SYSKEYUP = 0x105,
    //    WM_TCARD = 0x52,
    //    WM_TIMECHANGE = 0x1E,
    //    WM_TIMER = 0x113,
    //    WM_UNDO = 0x304,
    //    WM_UNINITMENUPOPUP = 0x125,
    //    WM_USER = 0x400,
    //    WM_USERCHANGED = 0x54,
    //    WM_VKEYTOITEM = 0x2E,
    //    WM_VSCROLL = 0x115,
    //    WM_VSCROLLCLIPBOARD = 0x30A,
    //    WM_WINDOWPOSCHANGED = 0x47,
    //    WM_WINDOWPOSCHANGING = 0x46,
    //    WM_WININICHANGE = 0x1A
    //}


}
